#ifndef BYTES_H_
#define BYTES_H_

#include "Constantes.h"

#include <string>
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <sstream>
#include <string.h>

using namespace std;

/*
 * Funcion: Clase para abstraer el manejo de bytes.
 */

class Bytes {

private:
	/*
	 * Nota: elejimos un string como tipo de dato para almacenar los bytes. Existen varias funciones estandars y utiles
	 * que nos facilitan el manejo. Además de poder almacenar todo tipo de bytes
	 */
	string bytes;
public:

	/*
	 * Pre: -
	 * Pos: Crea una nueva instancia.
	 */
	Bytes();

	/*
	 * Pre: -
	 * Pos: Crea una nueva instancia con los bytes pasados por argumento.
	 */
	Bytes(string bytes);

	/*
	 * Pre: -
	 * Pos: Crea una nueva instancia que contiene los mismos bytes que el objeto pasado por argumento.
	 */
	Bytes(const Bytes &bytes);

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~Bytes();

	/*
	 * Pre: -
	 * Pos: devuelve el tamanio del Byte.
	 */
	unsigned int getTamanio() const;

	/*
	 * Pre: -
	 * Pos: devuelve true si el objeto no contiene bytes almacenados.
	 */
	bool estaVacio() const;

	/*
	 * Pre: -
	 * Pos: devuelve un string con los bytes almacenados.
	 */
	string toString() const;

	/*
	 * Pre: -
	 * Pos: setea los bytes.
	 */
	void setBytes(const string &bytes);

	/*
	 * Pre: offset valido
	 * Pos: agrega los bytes en el offset pasado por argumento.
	 */
	bool agregar(const Bytes& bytes,offset offset);

	/*
	 * Pre: offset valido
	 * Pos: agrega los bytes de la cadena en el offset pasado por argumento.
	 */
	bool agregar(const string& bytes,offset offset);

	/*
	 * Pre: offset y tamanio validos
	 * Pos: agrega el dato transformado en bytes a los bytes almacenados en el offset indicado.
	 */
	bool agregar(void* dato, int tamanio,offset offset);

	/*
	 * Pre:-
	 * Pos: Agrega los bytes de la cadena al final de los bytes almacenados.
	 */
	bool agregarAlFinal(const string& bytes);

	/*
	 * Pre:-
	 * Pos: Agrega los bytes al final de los bytes almacenados.
	 */
	bool agregarAlFinal(const Bytes& bytes);

	/*
	 * Pre: -
	 * Pos: Agrega el dato transformado a bytes al final de los bytes almacenados.
	 */
	bool agregarAlFinal(void* dato, int tamanio);

	/*
	 * Pre: Buffer valido.
	 * Pos: guarda en el offset los bytes leidos.
	 */
	bool leer(void* buffer, offset offsetLeer,cantBytes tamanio)const;

	/*
	 * Pre: -
	 * Pos: Devuelve una instancia nueva que solo almacena los bytes indicados.
	 */
	Bytes getSubBytes(offset desde, cantBytes cantidad) const;

	/*
	 * Pre: -
	 * Pos: reemplaza el contenido indicado.
	 */
	bool reemplazar(const string &bytes, offset offset);

	/*
	 * Pre: Argumentos validos.
	 * Pos: remueve los bytes indicados.
	 */
	bool remover(offset offsetInicial,offset offsetFinal);

	/*
	 * Pre: -
	 * Pos: vacia el contenido almacenado.
	 */
	bool vaciar();

	/*
	 *Pre: el tamanio de bytes debe ser mayor que o .
	 *Pos: retorna el contenido de bytes en la posicion o.
	 */
	char operator[](offset o);

};

#endif /* BYTES_H_ */
